본문으로 건너뛰기

로또의 최고 순위와 최저 순위

📒 문제 설명

https://programmers.co.kr/learn/courses/30/lessons/77484

💻 언어

C++


풀이

  1. 입력 배열과 당첨 배열을 parameter로 받는다.
  2. 크기 2의 최저 순위와 최고 순위값을 넣을 result vector를 선언한다.

    굳이 vector가 아니어도 일반 변수를 선언해도 상관 없다.

  3. for 중첩문을 활용한다.

관련 알고리즘

-


사고 과정

📌 최고 순위 파악

  1. 첫 번째 for문에서는 최고 순위일 때를 Count한다.
  2. (it != win_nums.end() || lottos[j] == 0의 조건은 다음과 같다.
    • 알아볼 수 없는 숫자가 나올 때 (0의 입력값일 때)
    • iterator를 통해 값을 찾을 수 없지 않을 때 (== 값이 있을 때) 만약, 값이 없다면 당첨된 번호가 아닌 것이다.
  3. 이 과정을 통해 최고 순위를 Count한다.

📌 최저 순위 파악

  1. 두 번째 for문에서는 최저 순위일 때를 Count한다.
  2. it != win_nums.end()의 조건은 다음과 같다.
    • iterator를 통해 값을 찾을 수 없지 않을 때 (== 값이 있을 때) 만약, 값이 없다면 당첨된 번호가 아닌 것이다.
  3. 이 과정을 통해 최저 순위를 Count한다.

📌 Count한 숫자로 순위 매기기

  1. 각각 순위 파악이 끝나면 Count한 값을 통해 순위를 매긴다.
  2. result[i] = (result[i] - 7) * -1;의 조건은 다음과 같다.
    • Count한 값이 많을수록 순위는 높아진다. 다르게 말하면, 순위값은 낮아진다. (1등 = 1의 값)
    • Count한 값을 역순으로 돌리면 쉽게 순위값을 얻을 수 있다.
    • Count한 값을 역순으로 만들되 1 ~ 6의 범위가 나올 수 있도록 한다.
    • Count한 값 -7 (0 ~ 6 범위에서 -7 ~ -1로 변경)
    • 해당 값에 -1을 곱한다 (1 ~ 7의 범위로 변경)
    • 이 때 -7은 순위에 포함되지 않으므로 Count 값이 0일 때를 따로 부여한다. (Count 값이 0일 경우 순위는 6위)

결과

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> lottos, vector<int> win_nums)
{
vector<int> result(2);
vector<int>::iterator it;

for (size_t i = 0; i < 2; i++)
{
for (size_t j = 0; j < 6; j++)
{

it = find(win_nums.begin(), win_nums.end(), lottos[j]);

if (i == 0)
{ // 최고일 때
if (it != win_nums.end() || lottos[j] == 0)
result[i]++;
}
else
{ // 최저일 때
if (it != win_nums.end())
result[i]++;
}
}
if (result[i] != 0)
result[i] = (result[i] - 7) * -1;
else
result[i] = 6;
}
return result;
}